#include "string.h"
#include "json/json.h"
#include <fstream>
#include <iostream>
using namespace std;
namespace Json
{
    // json 转 字符串
    std::string json2string(Json::Value j, bool simple = true)
    {
        Json::StreamWriterBuilder builder;
        if (simple == true)
        {
            builder["commentStyle"] = "None";
            builder["indentation"] = "";
        }
        else
        {
            builder["commentStyle"] = "All";
            builder["indentation"] = "\t";
        }
        std::string output = Json::writeString(builder, j);
        // printf("%s",output.c_str());
        return output;
    }
    // 字符串转json
    bool string2json(Json::Value *j, const char *str)
    {
        Json::Value root;     // 创建JSON值对象
        Json::Reader reader;  // 创建JSON读取器
        std::string errorStr; // 用于存储解析错误信息

        // 假设jsonString是你要解析的JSON字符串
        if (!reader.parse(str, root, &errorStr))
        {
            printf("JSON parse error: %s\n", errorStr.c_str());
            // 处理错误，可能是返回错误代码或抛出异常等
            return false;
        }
        else
        {
            // 解析成功
            *j = root;
            return true;
        }
        return false;
    }

    // 从文件中读入，并转为json
    bool jsonfromfile(Json::Value &j, std::string file)
    {
        std::ifstream f(file);
        if (!(f.is_open()))
        {
            std::cout << "jsonfromfile,无法打开文件:" << file << std::endl;
            return false;
        }
        else
        {
            stringstream ss;
            std::string s;
            while (getline(f, s))
            {
                ss << s << std::endl;
            }
            f.close();
            std::cout << "读取文件:" << file << std::endl
                      << "内容为:" << ss.str() << std::endl;

            // string to json
            return string2json(&j, ss.str().c_str());
        }
        return false;
    }
    // 保存json到文件中
    bool json2file(Json::Value &j, std::string file)
    {
        ofstream o(file);
        if (!o.is_open())
        {
            std::cout << "json2file,无法打开文件:" << file << std::endl;
            return false;
        }
        else
        {
            std::string s = json2string(j, false);
            o << s << std::endl;
            o.close();
            std::cout << "写入文件" << file << std::endl
                      << "内容为:" << s << std::endl;
            return true;
        }
        return false;
    }

};
